#include <boost/foreach.hpp>
#include "Filter.h"
#include "../config/Config.h"

#define foreach BOOST_FOREACH
//#define DEBUG

using namespace kc_sf;

// ---------------------------------------------------------- //

Filter::Filter()
{
	f_rules = Config::getInstance().cRules;
}

// ---------------------------------------------------------- //

ActionType Filter::operator()( const Message &msg, int &matches_nr ) const
{
	float score_board[ ActionTypesNr ];
	for( size_t i = 0; i < ActionTypesNr; ++i )
	{
		score_board[ i ] = 1.0;
	}

	#ifdef DEBUG
	std::cout << "******************" << std::endl << std::endl;
	#endif // DEBUG

	matches_nr = 0;
	foreach( Rule rule, f_rules )
	{
		#ifdef DEBUG
		std::cout << "*** Regula ***" << std::endl;
		std::cout << "Akcja: " << ActionTypeToString( rule.getAction() ) << ", priorytet: " << rule.getPriority() << std::endl;
		#endif // DEBUG

		if( rule.eval( msg ) )
		{
			// uśrednia dotychczasową ocenę typu akcji i priorytet
		    float old_value = score_board[ rule.getAction() ];
		    float new_value = ( old_value + rule.getPriority() ) / 2;

		    int round = static_cast <int>( new_value * 100 );
		    score_board[ rule.getAction() ] = static_cast<float>( round ) / 100;

			++ matches_nr;
			#ifdef DEBUG
			std::cout << "Dopasowano\nNowy priorytet akcji: " << score_board[ rule.getAction() ]  << std::endl << std::endl;
			#endif // DEBUG
		}
		#ifdef DEBUG
		else
			std::cout << "Nie dopasowano" << std::endl << std::endl;
		#endif // DEBUG
	}

    // wybiera typ akcji
    float max_score = 1.0;
    ActionType action_type = Pass;

    // sprawdzenie, która akcja "zdobyła" najwięcej punktów
    // jeśli różne akcje mają taką samą ocenę, wybierana jest ta
    // wymieniona wcześniej
    for( int i = 0; i < ActionTypesNr; ++i )
    {
        if( max_score < score_board[ i ] )
        {
            max_score = score_board[ i ];
            action_type = (ActionType)i;
        }
    }

    return action_type;
}

